/*在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次，例如只加载一次配置文件、只关闭一次通道等。
Go语言中的sync包中提供了一个针对只执行一次场景的解决方案–sync.Once。
sync.Once只有一个Do方法，其签名如下：
func (o *Once) Do(f func()) {}*/

package main

import (
	"fmt"
	"sync"
)

// 实现单例

// 定义一个 sync.Once
var one sync.Once

// 定义一个animalSig的指针变量
var animalSig *Animalk

// 定义一个结构体
type Animalk struct {
	name string
	age  int
}

func getAnimalInstance() *Animalk {
	one.Do(func() {
		fmt.Println("只会执行一次")
		animalSig = &Animalk{"狗狗", 1}
	})
	return animalSig
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			res := getAnimalInstance()
			fmt.Printf("单例animalSig地址为：%p\n", res)
			wg.Done()
		}()
	}
	wg.Wait()

}
